package com.zzy.chattoai.config;

import com.zzy.chattoai.service.Assistant;
import com.zzy.chattoai.service.AssistantStream;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
import dev.langchain4j.service.AiServices;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class ChatModelFactory {

    @Value("${flow.api-key}")
    private String key;

    @Value("${flow.base-url}")
    private String url;

    @Value("${flow.mode-name}")
    private String modeName;

    private final static String SYSTEM_MESSAGE = "你是人工智能AI助手";

    @Bean
    public Assistant createChatMode() {
        OpenAiChatModel chatModel = OpenAiChatModel.builder()
                .apiKey(key)
                .modelName(modeName)
                .baseUrl(url)
                //在0和2之间。较高的值（如0.8）将使输出更随机，而较低的值（如0.2）将使其更集中和确定性。
                .temperature(0.8)
                //聊天完成时可以生成的令牌的最大数量。
                .maxTokens(4096).logRequests(true)
                .logResponses(true)
                //介于-2.0和2.0之间的数字。正值会根据新标记在文本中的现有频率对新标记进行惩罚，从而降低模型逐字重复同一行的可能性。
                //.frequencyPenalty()
                .build();
        MessageWindowChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);

        return AiServices.builder(Assistant.class).chatLanguageModel(chatModel).chatMemory(chatMemory).build();
    }

    @Bean
    public AssistantStream createStreamChatMode() {
        OpenAiStreamingChatModel chatModel = OpenAiStreamingChatModel.builder()
                .apiKey(key)
                .modelName(modeName)
                .baseUrl(url)
                //在0和2之间。较高的值（如0.8）将使输出更随机，而较低的值（如0.2）将使其更集中和确定性。
                .temperature(0.8)
                //聊天完成时可以生成的令牌的最大数量。
                .maxTokens(4096).logRequests(true)
                .logResponses(true)
                //介于-2.0和2.0之间的数字。正值会根据新标记在文本中的现有频率对新标记进行惩罚，从而降低模型逐字重复同一行的可能性。
                //.frequencyPenalty()
                .build();

        MessageWindowChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);
        return AiServices.builder(AssistantStream.class).streamingChatLanguageModel(chatModel).chatMemory(chatMemory).chatMemoryProvider(memoryId ->
                MessageWindowChatMemory.withMaxMessages(10)).build();

    }


}
